﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Timer
{
    /// <summary>
    /// Logica di interazione per MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        // Variabile tempo da contare
        int totale = 0;

        // Variabile di verifica
        bool verifica = true;
        bool pausa = true;

        // Timer
        System.Windows.Threading.DispatcherTimer myDispatcherTimer = new System.Windows.Threading.DispatcherTimer();

        // Inizio ora
        int inizio = 0;

        // Fine ora
        int fine = 0;

        // Gradi rotazione lancetta
        float gradi = 0;

        public void StartTimer(object o, RoutedEventArgs sender)
        {
            try
            {
                totale = Convert.ToInt32(txtTempo.Text);

                if (verifica == true && totale > 0)
                {
                    myDispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1); // 1000 Millisecondi = 1 Secondo
                    myDispatcherTimer.Tick += Each_Tick;

                    if (pausa == true)
                    {
                        inizio = Convert.ToInt32(DateTime.Now.Second);
                        fine = inizio;
                    }

                    myDispatcherTimer.Start();

                    verifica = false;
                    pausa = false;
                }

                // Nel caso il numero inserito fosse minore di 0 viene visualizzato l'errore
                else
                {
                    Console.Beep();
                    MessageBox.Show("Errore, il numero è negativo.");
                }
            }

            catch
            {
                Console.Beep();
                MessageBox.Show("Valore inserito errato!");
                txtTempo.Text = "";
            }
        }

        // Raised every 1000 miliseconds while the DispatcherTimer is active.
        void Each_Tick(object o, EventArgs sender)
        {
            fine++;

            // Mi preparo con i gradi per la lancetta
            gradi += 6;
            cronometro();

            if (totale == (fine-inizio)-1)
            {
                verifica = true;
                pausa = true;
                myDispatcherTimer.Tick -= Each_Tick;
                myDispatcherTimer.Stop();
                Console.Beep();
                Console.Beep();
                Console.Beep();
                txtTempoTrascorso.Text = "0";
                gradi = 360;
                cronometro();
            }

            else if (rdbTrascorso.IsChecked == true)
                txtTempoTrascorso.Text = (fine-inizio).ToString();

            else if (rdbPassato.IsChecked == true)
            {
                txtTempoTrascorso.Text = (totale - (fine-inizio)).ToString();
            }
        }

        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            myDispatcherTimer.Stop();
            myDispatcherTimer.Tick -= Each_Tick;
            verifica = true;
            pausa = true;
            txtTempoTrascorso.Text = "0";

            // Mi preparo con i gradi per la lancetta
            gradi = 360;
            cronometro();
        }

        private void btnPausa_Click(object sender, RoutedEventArgs e)
        {
            if (verifica == false)
            {
                myDispatcherTimer.Stop();
                myDispatcherTimer.Tick -= Each_Tick;
                verifica = true;
                pausa = false;
            }
        }

        void cronometro()
        {
            // Rotazione della lancetta
            RotateTransform rotate = new RotateTransform(gradi);
            // Coordinate centro di rotazione dell'immagine
            rotate.CenterX = 53;
            rotate.CenterY = 53;
            imgLancetta.RenderTransform = rotate;
        }

        // Con questo metodo il timer si avvia anche solo premendo enter (invio) al posto di premere il bottone start
        private void txtTempo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
                StartTimer(btnStart, new RoutedEventArgs());
        }
    }
}
